Skip to content

Manager API

「顿悟 Epiphany」提供了一组静态 Manager 类作为公共 API,供其他模组通过 Java 代码与系统交互。

TIP

所有 Manager 方法的玩家参数均为 ServerPlayer

INFO

KubeJS 脚本同样支持Manager API,详情请参见 KubeJS 兼容 章节

AptitudeManager

管理玩家的阅历值和心得点。

查询方法

java
// 获取玩家当前阅历值
long getAptitude(ServerPlayer player)

// 获取玩家当前心得点
int getInsightPoints(ServerPlayer player)

// 获取玩家已消耗的心得点总数
int getTotalInsightPointsSpent(ServerPlayer player)

修改方法

java
// 设置阅历值(截断到当前上限)
// 触发 AptitudeChangedEvent
void setAptitude(ServerPlayer player, long value)

// 增加阅历值。超额部分自动转化为心得点
// 触发 AptitudeChangedEvent, AptitudeLevelUpEvent, InsightPointsChangedEvent
void addAptitude(ServerPlayer player, long amount)

// 设置心得点数(截断到 >= 0)
// 触发 InsightPointsChangedEvent
void setInsightPoints(ServerPlayer player, int value)

ModuleManager

管理玩家的模块数据。

查询方法

java
// 模块是否已解锁(可以被选择)
boolean isUnlocked(ServerPlayer player, ResourceLocation moduleId)

// 模块是否已被选择
boolean isSelected(ServerPlayer player, ResourceLocation moduleId)

// 模块是否已完成
boolean isCompleted(ServerPlayer player, ResourceLocation moduleId)

修改方法

java
// 设置模块解锁状态
// 触发 ModuleUnlockEvent (Pre) 和 ModuleUnlockedEvent (Post)
void setUnlocked(ServerPlayer player, ResourceLocation moduleId, boolean unlocked)

// 选择模块(消耗心得点,检查条件和上限)
// 触发 ModuleSelectEvent (Pre) 和 ModuleSelectedEvent (Post)
// 应用 on_select_reward
void select(ServerPlayer player, ResourceLocation moduleId)

// 完成模块(检查所有心得是否已解锁,授予顿悟槽)
// 触发 ModuleCompleteEvent (Pre) 和 ModuleCompletedEvent (Post)
// 应用 on_complete_reward
void complete(ServerPlayer player, ResourceLocation moduleId)

// 强制选择(忽略消耗和条件)
// 触发 ModuleSelectedEvent (Post)
void forceSelect(ServerPlayer player, ResourceLocation moduleId)

// 强制完成(忽略心得检查,授予顿悟槽)
// 触发 ModuleCompletedEvent (Post)
void forceComplete(ServerPlayer player, ResourceLocation moduleId)

// 重置模块(退还心得点,移除奖励)
void resetModule(ServerPlayer player, ResourceLocation moduleId)

// 自动解锁满足条件的 locked 模块
// skipEventDriven:是否跳过轮询
// silent:是否触发 NotificationListener 中的通知消息
void checkAutoUnlock(ServerPlayer player, boolean skipEventDriven, boolean silent)

// 清理注册表中已不存在的 module
void cleanupOrphanedData(ServerPlayer player)

InsightManager

管理玩家的心得状态。

查询方法

java
// 心得是否已被选择
boolean isSelected(ServerPlayer player, ResourceLocation insightId)

// 心得所处的模块是否被选择
boolean isModuleSelected(ServerPlayer player, ResourceLocation insightId)

修改方法

java
// 选择心得(消耗心得点,检查前置条件)
// 触发 InsightSelectEvent (Pre) 和 InsightSelectedEvent (Post)
void select(ServerPlayer player, ResourceLocation insightId, ResourceLocation moduleId)

// 强制选择心得(忽略消耗和前置条件)
void forceSelect(ServerPlayer player, ResourceLocation insightId, ResourceLocation moduleId)

// 重置心得(退还心得点,移除奖励)
void resetInsight(ServerPlayer player, ResourceLocation insightId)

EpiphanyManager

管理玩家的顿悟状态。

查询方法

java
// 顿悟是否已解锁(可以被选择)
boolean isUnlocked(ServerPlayer player, ResourceLocation epiphanyId)

// 顿悟是否已被选择
boolean isSelected(ServerPlayer player, ResourceLocation epiphanyId)

修改方法

java
// 设置顿悟解锁状态
void setUnlocked(ServerPlayer player, ResourceLocation epiphanyId, boolean unlocked)

// 选择顿悟(检查槽位和条件)
// 触发 EpiphanySelectEvent (Pre) 和 EpiphanySelectedEvent (Post)
void select(ServerPlayer player, ResourceLocation epiphanyId)

// 强制选择(忽略槽位和条件)
void forceSelect(ServerPlayer player, ResourceLocation epiphanyId)

// 重置顿悟
void resetEpiphany(ServerPlayer player, ResourceLocation epiphanyId)

// 清理注册表中已不存在的 Epiphany
void cleanupOrphanedData(ServerPlayer player)

// 自动解锁满足条件的 locked 顿悟
// skipEventDriven:是否跳过轮询
// silent:是否触发 NotificationListener 中的通知消息
void checkAutoUnlock(ServerPlayer player, boolean skipEventDriven, boolean silent)

AptitudeSourceManager

管理阅历的发放与获取。

java

// 发放阅历
// behaviorId: 行为 ID(如 mymod:foo)
// targetId: 目标 ID(如被击杀的实体类型)
// registry: targetId 所属的注册表,用于查找 tag。可为 null
boolean grant(ServerPlayer sp, ResourceLocation behaviorId, ResourceLocation targetId, @Nullable Registry<?> registry)

使用示例:

java
@SubscribeEvent
static void onCustomMobKill(LivingDeathEvent event) {
    if (!(event.getSource().getEntity() instanceof ServerPlayer sp)) return;
    ResourceLocation targetId = BuiltInRegistries.ENTITY_TYPE.getKey(event.getEntity().getType());
    AptitudeSourceManager.grant(
        sp,
        ResourceLocation.fromNamespaceAndPath("mymod", "custom_kill"),
        targetId,
        BuiltInRegistries.ENTITY_TYPE
    );
}

AptitudeFormula

阅历计算公式类。目前只实现了线性运算,计划加入更多公式支持。 公式:

required=Config.baseAptitudeCap+(totalSpent+insightPoints)×Config.aptitudeCapGrowth \text{required} = \text{Config.baseAptitudeCap} + (\text{totalSpent} + \text{insightPoints}) \times \text{Config.aptitudeCapGrowth}

java
// 计算获得下一个心得点所需的阅历值
// totalSpent: 已消耗心得点总数
// insightPoints: 当前可用心得点数
// 返回: 所需阅历值
long calcRequiredAptitude(long totalSpent, int insightPoints)

处理模式

所有 Manager 方法遵循统一的流程:

1. player.getData(AttachmentType) → 获取当前数据
2. 创建新的不可变数据记录(with* 方法)
3. player.setData(AttachmentType, newData) → 持久化 + 自动同步到客户端
4. NeoForge.EVENT_BUS.post(Event) → 触发事件

INFO

PlayerEpiphanyData 是不可变 record,所有修改通过 with*() 方法返回新实例。

方法总表

Manager方法描述返回
AptitudeManagergetAptitude当前阅历long
AptitudeManagergetInsightPoints可用心得点int
AptitudeManagergetTotalInsightPointsSpent累计已花费心得点int
AptitudeManagersetAptitude设置阅历void
AptitudeManageraddAptitude增加阅历,溢出部分自动转心得点void
AptitudeManagersetInsightPoints直接覆盖可用心得点(不改 totalSpent)void
ModuleManagerisUnlocked模块是否已解锁boolean
ModuleManagerisSelected模块是否已选boolean
ModuleManagerisCompleted模块是否已完成boolean
ModuleManagersetUnlocked设置解锁状态void
ModuleManagerselect选择模块void
ModuleManagerforceSelect强制选择void
ModuleManagercomplete完成模块void
ModuleManagerforceComplete强制完成void
ModuleManagerresetModule重置模块void
ModuleManagercheckAutoUnlock扫描自动解锁 LOCKED 且 condition 满足的模块void
ModuleManagercleanupOrphanedData清理注册表中已不存在的 modulevoid
InsightManagerisSelected心得是否已点亮boolean
InsightManagerisModuleSelected心得所属模块是否已选boolean
InsightManagerselect选择心得void
InsightManagerforceSelect强制选择void
InsightManagerresetInsight重置心得void
EpiphanyManagerisUnlocked顿悟是否已解锁boolean
EpiphanyManagerisSelected顿悟是否已激活boolean
EpiphanyManagersetUnlocked设置解锁状态void
EpiphanyManagerselect激活顿悟void
EpiphanyManagerforceSelect强制激活void
EpiphanyManagerresetEpiphany重置顿悟void
EpiphanyManagercheckAutoUnlock扫描自动解锁 LOCKED 且 condition 满足的顿悟void
EpiphanyManagercleanupOrphanedData清理注册表中已不存在的 epiphanyvoid
AptitudeSourceManagergrant发放阅历boolean
AptitudeSourceManagerresolve纯查询某 behavior+target 的奖励Resolution
AptitudeFormulacalcRequiredAptitude计算获得下一心得点所需阅历long